package com.erp.erp_dao.Cost;

import com.erp.erp_entitys.Cost.entity.CostEntity;
import com.erp.erp_entitys.Cost.req.*;
import com.erp.erp_entitys.Cost.vo.*;
import com.erp.erp_entitys.warehouse.entity.AnnexEntity;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;

/**
 * @author zjk
 * @version 1.0
 * @description
 * @date 2020/11/17/017 21:44
 */
public interface CostDao {
    int deleteByPrimaryKey(Integer id);


    /**
     * 根据费用编号查找费用实体
     * @param code
     * @return
     */
    CostEntity selectByPrimaryKey(String code);

    int updateByPrimaryKeySelective(CostEntity record);

    int updateByPrimaryKey(CostEntity record);

    /**
     * 根据条件查询费用列表
     * @param req
     * @return  返回费用集合
     */
    List<CostEntity> findAll(QueryCostReq req);
    /**
     * 根据条件查询费用列表
     * @param req
     * @return  返回费用集合
     */
    List<QueryCostRes> findAllQueryCostRes(QueryCostReq req);
    /**
     * 修改费用实体
     * @param costEntity
     * @return
     */
    int updateByCostEntity(CostEntity costEntity);
    /**
     * 修改费用中的实付金额和实付日期
     * @return
     */
    int updateCostAndTime(@Param("totalCost") BigDecimal totalCost, @Param("totalCostCreateTime")Date totalCostCreateTime,@Param("code")String code);
    /**
     * 根据当天时间，查询费用编号总数量
     * @param createTime  费用创建时间
     * @return
     */
    int selectCodeByCode(@Param("createTime") LocalDate createTime);
    //-----------------------------------------------------------------------
    /**
     * 查找公司信息表,获取制单公司信息
     * @return  返回制单公司名称和编号BillCompany
     */
    List<QueryBillCompanyVO>  selectCompanyForBillCompanyCode();
    /**
     * 查找组织机构表
     * @param BillCompanyCode   制单公司编号
     * @return 返回制单公司信息
     */
    QueryBillCompanyVO selectCompanyForBillCompanyCode2(@Param("companyCode") String companyCode);

    /**
     * 查找供应商表，获得收款单位
     * @return  返回收款单位信息
     */
    List<QueryPayeeVO>  selectCustomer2ForPayee();

    /**
     * 查找供应商表，获得收款单位
     * @param payeeCode 收款单位编号
     * @return 返回收款单位信息
     */
    List<QueryPayeeVO>  selectCustomer2ForPayee(@Param("payeeCode") String payeeCode);

    /**
     * 获得收款单位对应的银行信息
     * @param payeeCode 收款单位编号
     * @return 返回银行信息
     */
    List<QueryPayeeBankVO>  selectPayeeBankName(@Param("payeeCode") String payeeCode);
    /**
     * 获得银行名称对应的银行账号
     * @param payeeCode 银行名称
     * @return 返回银行账号
     */
    List<QueryPayeeBankVO>  selectPayeeBankAccount(@Param("bankName") String bankName,@Param("payeeCode") String payeeCode);
    /**
     * 获取银行账号名称
     * @param payeeCode 供应商编码
     * @param bankAccount 银行账号
     * @return
     */
    String selectPayeeBankAccountName(@Param("payeeCode") String payeeCode,@Param("bankAccount") String bankAccount);
    /**
     * 查询所有收款单位编号，查询收款单位信息，银行名称信息，银行账号信息
     * @param payeeCode
     * @return
     */
    List<QueryPayeeVO2> selectPayeeBankInfo();
    /**
     * 获得部门信息
     * @param deptAccReq    核算人员参数
     * @return  返回部门集合
     */
    List<QueryDeptVO>  selectDeptByAcc(QueryDeptAccReq deptAccReq);
    /**
     * 获得部门信息
     * @return  返回部门集合
     */
    List<QueryDeptVO2>  selectDept();


    /**
     * 获得员工信息
     * @param deptAccReq    核算部门参数
     * @return  返回员工集合
     */
    List<QueryAccVO>  selectAccByDept(QueryDeptAccReq deptAccReq);
    /**
     * 获得员工信息
     * @param deptAccReq    核算部门参数
     * @return  返回员工集合
     */
    List<QueryAccVO2>  selectAcc();

    /**
     * 根据部门编号获取核算人员
     * @param deptCode
     * @return
     */
    List<QueryAccVO2> selectAccByDeptCode(@Param("deptCode") String deptCode);
    /**
     * 获取字典中所有费用名称
     * @param req 查询参数
     * @return 字典信息
     */
    List<DictionaryCostFeeVO> getDictionaryCostFee(DictionaryCostReq req);

    //--------------------------------------------------------------------------



    /**
     * 查找所有发票
     * @param importInvoiceReq 输入条件实体-查询结汇明细
     * @return
     */
    List<QueryImportInvoiceVO> selectInvoiceByInvoiceTypeOne(QueryImportInvoiceReq importInvoiceReq);
    /**
     * 查找所有发票
     * @param importInvoiceReq 输入条件实体-查询出运明细
     * @return
     */
    List<QueryImportInvoiceVO> selectInvoiceByInvoiceTypeTwo(QueryImportInvoiceReq importInvoiceReq);

    /**
     * 查找所有外销合同
     * @param importContractReq 输入条件实体
     * @return
     */
    List<QueryImportContractVO> selectContractByPrimary(QueryImportContractReq importContractReq);
    /**
     * 查找所有采购合同
     * @param importContractReq 输入条件实体
     * @return
     */
    List<QueryImportContractVO> selectPurchaseContractByPrimary(QueryImportContractReq importContractReq);


    /**
     * 查找所有资源样品
     * @param req 输入条件实体
     * @return
     */
    List<QueryImportResourceSamplesVO> selectResourceSamplesByPrimary(QueryImportResourceSamplesReq req);



    /**
     * 获取所有用户，适用于查询业务员，操作员，制单公司
     * @return
     */
    List<QueryAllUserVO> selectAllUser();


    /**
     * 添加费用
     * @param cost 费用实体
     * @return  成功添加数据的记录数
     */
    int insertSelective(CostEntity record);


    //*********************************************************

    /**
     * 删除费用时，修改费用状态
     * @param costId
     * @return
     */
    int updateCostStatus(@Param("costId") Integer costId);

    /**
     * 根据费用id删除费用主信息
     * @param costId
     * @return
     */
    int delCostByCostId(@Param("costId") Integer costId);

    /**
     * 提交审批时，修改费用状态
     * @param costId
     * @return
     */
    int updateCostTypeByCostId(@Param("costIds") Integer[] costIds, @Param("status") Integer status);

    /**
     * 更新审批的状态
     * @param req
     * @return
     */
    int updateCostStatusByCostId(UpdateCostStatusBpmReq req);
    /**
     * 更新流程状态
     * @param bid 费用主键
     * @param bpmStatus 流程状态
     * @return
     */
    boolean updateStatus(@Param("costId") String costId, @Param("bpmStatus")String bpmStatus);
    /**
     * 还原费用状态，从垃圾箱还原到草稿箱
     * @param costId
     * @return
     */
    int updateCostStatusDustbinToDrafts(Integer costId);


    /**
     * 根据费用id查找费用实体
     * @param costId
     * @return
     */
    CostEntity findCostById(Integer costId);
    /**
     * 根据附件id集合修改附件的状态
     * @param ids   附件ID集合
     * @param valid 状态 0：无效，1：有效
     * @return
     */
    Integer updateAnnexValid(@Param("ids") List<Integer> ids,@Param("valid") Integer valid);
    /**
     * 根据附件id查找附件信息
     * @param annexId   附件ID
     * @return
     */
    AnnexEntity selectAnnexById(Integer annexId);


    /**
     * 费用统计
     * @param req
     * @return
     */
    List<QueryCostStatistics1VO> costStatistics1List(QueryCostStatistics1Req req);

    /**
     * 费用支付统计
     * @param req
     * @return
     */
    List<QueryCostStatistics2VO> costStatistics2List(QueryCostStatistics1Req req);


    /**
     *  根据标记，指定code查询哪种编号
     *  mark 1：结汇发票 2：出运明细 3：外销合同号 4：资源样品 5：间接费用
     * @return
     */
    List<Integer> findIdsByContractOrStock(@Param("code") String code,
                                           @Param("mark") Integer mark);

    /**
     * 根据id集合查询费用
     * @param ids
     * @return  返回费用集合
     */
    List<QueryCostRes> findCostByIds(@Param("ids") String ids);
}
